/**
 * 基础控制器类
 * 定义跨项目调用相关的基础方法
 */
class BaseController {
  /**
   * 获取跨项目上下文
   * @returns {Object} 跨项目上下文
   */
  getCrossContext() {
    return this._crossContext || null;
  }

  /**
   * 检查是否为跨项目调用
   * @returns {Boolean} 是否为跨项目调用
   */
  isCrossProjectCall() {
    return this._crossContext && this._crossContext.isCrossProjectApi;
  }

  /**
   * 获取源项目标识
   * @returns {String} 源项目标识
   */
  getSourceProject() {
    return this._crossContext ? this._crossContext.sourceProject : null;
  }

  /**
   * 调用跨项目服务
   * @param {String} targetProject 目标项目
   * @param {String} apiPath 接口路径
   * @param {Object} data 请求数据
   * @returns {Promise<Object>} 接口返回结果
   */
  async callCrossProjectApi(targetProject, apiPath, data = {}) {
    if (!targetProject || !apiPath) {
      return this.fail('无效的跨项目调用参数');
    }
    
    console.log(`[Controller] 发起跨项目调用: ${targetProject} -> ${apiPath}`);
    
    // 源项目标识
    const sourceProject = global.PID || 'unknown';
    
    // 构建API路径
    const route = `${targetProject}_api/${apiPath}`;
    
    // 生成API令牌
    const AppAuth = require('../core/app_auth.js');
    const apiToken = await AppAuth.generateApiToken(sourceProject, targetProject);
    
    // 构建请求事件
    const event = {
      route,
      sourceProject,
      apiToken,
      data: {
        ...data,
        _cross: {
          source: sourceProject,
          timestamp: Date.now()
        }
      }
    };
    
    // 加载路由器
    const AppRouter = require('../core/app_router.js');
    
    try {
      // 加载目标项目路由配置
      const routes = require(`../../project/${targetProject}/public/route.js`);
      
      // 执行路由调用
      const result = await AppRouter.router({ routes, event, context: {} });
      
      if (!result || result.code !== 1) {
        console.error(`[Controller] 跨项目调用失败: ${route}`, result);
        return this.fail(`跨项目调用失败: ${result.msg || '未知错误'}`);
      }
      
      return result.data;
    } catch (err) {
      console.error(`[Controller] 跨项目调用异常: ${route}`, err);
      return this.fail(`跨项目调用异常: ${err.message || '未知错误'}`);
    }
  }
  
  /**
   * 返回失败结果
   * @param {String} msg 错误消息
   * @returns {Object} 错误结果对象
   */
  fail(msg) {
    return { code: -1, msg };
  }
}

// 导出基础控制器类
module.exports = BaseController; 